package com.example.sqliteprueba;

import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Vector;

import com.jjoe64.graphview.BarGraphView;
import com.jjoe64.graphview.GraphView;
import com.jjoe64.graphview.GraphView.GraphViewData;
import com.jjoe64.graphview.GraphViewSeries;
import com.jjoe64.graphview.LineGraphView;

import android.R.color;
import android.app.Activity;
import android.app.ListActivity;
import android.content.Context;
import android.content.Intent;
import android.graphics.Color;
import android.os.Bundle;
import android.text.format.DateFormat;
import android.util.Log;
import android.view.ContextMenu;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.View.OnClickListener;
import android.view.Window;
import android.view.WindowManager;
import android.view.inputmethod.InputMethodManager;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TableLayout;
import android.widget.TableRow;
import android.widget.TextView;

public class MainActivity extends ListActivity {
	// private Button btnAgregar;
	private Button btnGrafico;
	private Button btnConsumo;
	private Button btnConsumoTotal;
	// private Button btnSalir;
	private CargaDAO datasource;
	private MiAdaptador adapter;
	private static Holder holderSeleccionada;
	public static int REGISTRAR_CARGA_SCREEN_REQUESTED = 100;
	public static int GRAFICO_SCREEN_REQUESTED = 101;
	public static int CONSUMOS_SCREEN_REQUESTED = 102;
	public static int CONSUMO_TOTAL_SCREEN_REQUESTED = 103;

	@Override
	protected void onCreate(Bundle savedInstanceState) {

		// Informacion de la STATUSBAR y de la NOTIFICATION BAR
		// http://blog.vogella.com/2011/02/28/android-hidding-the-status-and-title-bar/
		// Ocultar la TITLEBAR
		// requestWindowFeature(Window.FEATURE_NO_TITLE);

		// INICIO de codigo para ocultar la STATUSBAR
		// getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);
		// FIN de codigo para ocultar la STATUSBAR

		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		// btnAgregar = (Button) findViewById(R.id.btnAgregar);
		btnGrafico = (Button) findViewById(R.id.btnGrafico);
		// btnSalir = (Button) findViewById(R.id.btnSalir);
		btnConsumo = (Button) findViewById(R.id.btnConsumo);
		btnConsumoTotal = (Button) findViewById(R.id.btnConsumoTotal);
		

		// getWindow().setSoftInputMode(
		// WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);

		btnGrafico.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				// init example series data
				// Intent intent = new Intent(this, ConsumosActivity.class);
				// startActivityForResult(intent,
				// REGISTRAR_CARGA_SCREEN_REQUESTED);
				executeOpenGraficoActivityForResult();
			}
		});

		btnConsumo.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				// init example series data
				// Intent intent = new Intent(this, ConsumosActivity.class);
				// startActivityForResult(intent,
				// REGISTRAR_CARGA_SCREEN_REQUESTED);
				executeOpenConsumosActivityForResult();
			}
		});
		
		btnConsumoTotal.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				// init example series data
				// Intent intent = new Intent(this, ConsumosActivity.class);
				// startActivityForResult(intent,
				// REGISTRAR_CARGA_SCREEN_REQUESTED);
				executeOpenConsumosTotalActivityForResult();
			}
		});

		// Salgo de la aplicacion

		// btnSalir.setOnClickListener(new OnClickListener() {
		//
		// @Override
		// public void onClick(View v) {
		// finish();
		// }
		// });

		// btnAgregar.setOnClickListener(new OnClickListener() {
		//
		// @Override
		// public void onClick(View v) {
		// // TODO Auto-generated method stub
		// // EditText txt1 = (EditText) findViewById(R.id.editText1);
		// // EditText txt2 = (EditText) findViewById(R.id.editText2);
		// // EditText txt3 = (EditText) findViewById(R.id.editText3);
		// // EditText txt4 = (EditText) findViewById(R.id.editText4);
		// //
		// // Carga carga = new Carga();
		// // carga.setFecha(String.valueOf(txt1.getText()));
		// // carga.setKm(Float.parseFloat(String.valueOf(txt2.getText())));
		// // carga.setPrecio(Float.parseFloat(String.valueOf(txt3.getText())));
		// // carga.setLitrosCargados(Float.parseFloat(String.valueOf(txt4
		// // .getText())));
		// // carga=datasource.createCarga(carga);
		// // adapter.agregar(carga);
		// // adapter.notifyDataSetChanged();
		// // txt2.setText("");
		// // txt3.setText("");
		// // txt4.setText("");
		// // txt1.clearFocus();
		// // hideKeyboard();
		// executeOpenRegistrarCargaActivityForResult();
		// }
		// });

		datasource = new CargaDAO(this);
		// datasource.open();
		List<Carga> cargas = datasource.getAllCargas();
		adapter = new MiAdaptador(this, cargas);
		setListAdapter(adapter);

		// Date hoy = new Date();
		// SimpleDateFormat df = new SimpleDateFormat("dd-MM-yyyy");
		// // Get the date today using Calendar object.
		// Date today = Calendar.getInstance().getTime();
		// // Using DateFormat format method we can create a string
		// // representation of a date with the defined format.
		// String reportDate = df.format(today);
		// EditText txt1 = (EditText) findViewById(R.id.editText1);
		// txt1.setText(reportDate);

	}

	protected void executeOpenRegistrarCargaActivityForResult() {
		// Abrir activity Second sin tomar en cuenta la respuesta
		Intent intent = new Intent(this, RegistrarCargaActivity.class);
		startActivityForResult(intent, REGISTRAR_CARGA_SCREEN_REQUESTED);

		// Intent i = new Intent(this, RegistrarCargaActivity.class);
		// startActivity(i);
		// overridePendingTransition(R.anim.fade_in, R.anim.fade_out);
		overridePendingTransition(android.R.anim.fade_in,
				android.R.anim.fade_out);

	}

	protected void executeOpenGraficoActivityForResult() {
		// Abrir activity Second sin tomar en cuenta la respuesta
		Intent intent = new Intent(this, GraficoActivity.class);
		startActivityForResult(intent, GRAFICO_SCREEN_REQUESTED);

		// Intent i = new Intent(this, ConsumosActivity.class);
		// startActivity(i);
		// overridePendingTransition(R.anim.fade_in, R.anim.fade_out);
		overridePendingTransition(android.R.anim.fade_in,
				android.R.anim.fade_out);

	}

	protected void executeOpenConsumosActivityForResult() {
		// Abrir activity Second sin tomar en cuenta la respuesta
		Intent intent = new Intent(this, ConsumosActivity.class);
		startActivityForResult(intent, CONSUMOS_SCREEN_REQUESTED);

		// Intent i = new Intent(this, ConsumosActivity.class);
		// startActivity(i);
		// overridePendingTransition(R.anim.fade_in, R.anim.fade_out);
		overridePendingTransition(android.R.anim.fade_in,
				android.R.anim.fade_out);

	}
	
	protected void executeOpenConsumosTotalActivityForResult() {
		// Abrir activity Second sin tomar en cuenta la respuesta
		Intent intent = new Intent(this, ConsumoTotalActivity.class);
		startActivityForResult(intent, CONSUMO_TOTAL_SCREEN_REQUESTED);

		// Intent i = new Intent(this, ConsumosActivity.class);
		// startActivity(i);
		// overridePendingTransition(R.anim.fade_in, R.anim.fade_out);
		overridePendingTransition(android.R.anim.fade_in,
				android.R.anim.fade_out);

	}

	// protected void executeOpenActivity() {
	// // Abrir activity Second sin tomar en cuenta la respuesta
	// Intent intent = new Intent(this, Second.class);
	// startActivity(intent);
	//
	// }

	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		super.onActivityResult(requestCode, resultCode, data);
//		Log.e("requestCode", String.valueOf(requestCode));
//		Log.e("resultCode", String.valueOf(resultCode));

		// S�lo se ejecuta cuando el activity se llam� con
		// startActivityForResult
		
		if (requestCode == REGISTRAR_CARGA_SCREEN_REQUESTED
				&& resultCode == RegistrarCargaActivity.RESULTADO_EXITOSO) {
			List<Carga> cargas = datasource.getAllCargas();
			adapter = new MiAdaptador(this, cargas);
			setListAdapter(adapter);
		}

		// Log.e("requestCode", String.valueOf(requestCode));
		// Log.e("resultCode", String.valueOf(resultCode));
		// if (requestCode==REGISTRAR_CARGA_SCREEN_REQUESTED) {
		// Log.e("requestCode", String.valueOf(requestCode));
		// }
		// if (requestCode == SECOND_SCREEN_REQUESTED) {
		// Log.d(LOG_TAG,
		// "onActivityResult!! SECOND_SCREEN_REQUESTED resultCode: "
		// + resultCode);
		// Log.e("ESTA",
		// "onActivityResult!! SECOND_SCREEN_REQUESTED resultCode: "
		// + resultCode);
		// }
	}

	private void hideKeyboard() {
		InputMethodManager inputManager = (InputMethodManager) this
				.getSystemService(Context.INPUT_METHOD_SERVICE);

		// check if no view has focus:
		View view = this.getCurrentFocus();
		if (view != null) {
			inputManager.hideSoftInputFromWindow(view.getWindowToken(),
					InputMethodManager.HIDE_NOT_ALWAYS);
		}
	}

	class Holder {// Clase encargada de manjeter una referencia a los elementos
					// de un layout (la linea) en un objeto holder (ose aun
					// objeto de sta clase) en un momento determinado (osea en
					// una view en el objeto Tag)
		private long id;
		private TextView txtFecha;
		private TextView txtKms;
		private TextView txtPrecioLitro;
		private TextView txtLitros;

	}

	public class MiAdaptador extends BaseAdapter {
		private final Activity actividad;
		private final List<Carga> lista;

		public MiAdaptador(Activity actividad, List<Carga> lista) {
			super();
			this.actividad = actividad;
			this.lista = lista;
		}

		/**
		 * position: es un numero que representa la linea de la que se va a
		 * devolver el View. convertView: Es la view que actualmente se
		 * encuentra en esa linea. Hay que tener en cuenta que si en la pantalla
		 * se pueden ver 12 lineas, solamente se van a retornar constantemente
		 * esas 12 view. (Salvo cuando se gire la pantalla. Cada vez que se
		 * fgire se vuelven a crear todas las views de nuevo, pero sino se
		 * reutilizan las mismas 12 por siempre.) parent: contenedor de vistas
		 * donde el objeto va a ser a�adido (?) (WTF)
		 */
		public View getView(int position, View convertView, ViewGroup parent) {
			Holder holder;

			if (convertView == null) {// Si la view que actualmente se encuentra
										// en esa posicion es NULL significa que
										// se esta dezplazando para abajo y que
										// es un item nuevo que nunca se ha
										// visto. Osea que esa linea nunca se ha
										// seteado.
				// verificacion de cuantas VIew se crearon

				// Creo la linea del item basandome en el layout
				// item_perosnalizado
				LayoutInflater inflater = LayoutInflater
						.from(MainActivity.this);
				convertView = inflater.inflate(R.layout.item_lista_carga, null);

				// Creo una nueva clase Holder, le seteo los elementos del
				// layout y luego se la asigno al elemento Tag de la View (que
				// esta referenciada por el objeto contentView)
				holder = new Holder();
				holder.txtFecha = (TextView) convertView
						.findViewById(R.id.txtFecha);
				holder.txtKms = (TextView) convertView
						.findViewById(R.id.txtKms);
				holder.txtPrecioLitro = (TextView) convertView
						.findViewById(R.id.txtPrecio);
				holder.txtLitros = (TextView) convertView
						.findViewById(R.id.txtLitros);
				convertView.setTag(holder);
			} else {// Si la view no es NULL significa que esta volviendo hacia
					// arriba, y eso quiere decir que esta volviendo sobre una
					// linea que ya paso. Osea que ya existe. Osea que la view
					// tiene en su objeto Tag el objeto de la clase Holder
					// asignado con todos los elementos de la view
					// referenciados.
				holder = (Holder) convertView.getTag();
			}

			// Aca lo que hago es modificar directamente los objetos que se
			// encuentren en el objeto de la clase Holder. Ya que estos hacen
			// referencia a los objetos del layout.
			Carga carga = lista.get(position);
			holder.id = carga.getId();
			SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy");
			holder.txtFecha.setText(sdf.format(carga.getFecha()));
			holder.txtKms.setText(formatearFloat(carga.getKm()));
			holder.txtPrecioLitro.setText(formatearFloat(carga.getPrecio()));
			holder.txtLitros.setText(formatearFloat(carga.getLitrosCargados()));
			if (carga.isTanqueLleno()) {
				convertView.setBackgroundColor(Color.rgb(245, 188, 169));
			} else {
				convertView.setBackgroundColor(Color.TRANSPARENT);
			}

			registerForContextMenu(convertView);
			return convertView;
		}

		public String formatearFloat(float valor) {
			String aux = new DecimalFormat("#.##").format(valor);
			if (aux.endsWith(".00")) {
				aux = aux.replaceAll("\\.?0*$", "");
			}
			return aux;
		}
		
		public int getCount() {
			return lista.size();
		}

		public Object getItem(int position) {
			return lista.get(position);
		}

		public long getItemId(int position) {
			return position;
		}

		public void agregar(Carga carga) {
			lista.add(carga);
		}

		public void eliminar(Carga carga) {
			lista.remove(carga);
		}
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		// getMenuInflater().inflate(R.menu.main, menu);
		getMenuInflater().inflate(R.menu.menu_principal, menu);
		return true;
	}

	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		// Handle action bar item clicks here. The action bar will
		// automatically handle clicks on the Home/Up button, so long
		// as you specify a parent activity in AndroidManifest.xml.
		int id = item.getItemId();
		if (id == R.id.menu_new) {
			executeOpenRegistrarCargaActivityForResult();
		}
		return super.onOptionsItemSelected(item);
	}

	@Override
	protected void onResume() {
		// datasource.open();
		super.onResume();
	}

	@Override
	protected void onPause() {
		// datasource.close();
		super.onPause();
	}

	@Override
	public void onCreateContextMenu(ContextMenu menu, View v,
			ContextMenuInfo menuInfo) { // Este evento ocurre cuando se mantiene
										// presionado el boton sobre un widget.
		super.onCreateContextMenu(menu, v, menuInfo);
		TableLayout aux = ((TableLayout) v);
		holderSeleccionada = (Holder) aux.getTag();
		// TableRow aux2 = (TableRow) aux.getChildAt(0);
		// long idAEliminar = ((Holder) aux.getTag()).id;
		// Carga carga = new Carga();
		// carga.setId(idAEliminar);
		// datasource.deleteCarga(carga);

		MenuInflater inflater = getMenuInflater();
		inflater.inflate(R.menu.menu_seleccion_carga, menu);

	}

	@Override
	public boolean onContextItemSelected(MenuItem item) { // Este metodo ocurre
															// cuando se
															// selecciona una
															// opcion de un menu
															// contextual.
		// TextView lblMensaje = (TextView) findViewById(R.id.lblMensaje);
		switch (item.getItemId()) {
		case R.id.menuModificar:
			// lblMensaje.setText("Etiqueta CONTEXTUAL: Opcion 1 pulsada!");
			Intent intent = new Intent(this, RegistrarCargaActivity.class);
			intent.putExtra("new_variable_name", holderSeleccionada.id);
			startActivityForResult(intent, REGISTRAR_CARGA_SCREEN_REQUESTED);
			holderSeleccionada = null;
			return true;
		case R.id.menuEliminar:
			long idAEliminar = holderSeleccionada.id;
			Carga carga = new Carga();
			carga.setId(idAEliminar);
			Log.e("ELIMINAR", "ELIMINAR CARGA:" + String.valueOf(carga.getId()));
			datasource.deleteCarga(carga);
			adapter.eliminar(carga);
			adapter.notifyDataSetChanged();
			Log.e("ELIMINAR",
					"ELIMINAR CARGA:" + String.valueOf(adapter.getCount()));
			holderSeleccionada = null;
			// lblMensaje.setText("Etiqueta CONTEXTUAL: Opcion 2 pulsada!");
			return true;
		default:
			return super.onContextItemSelected(item);
		}
	}

}
